use rusqlite::Connection;
use std::sync::Arc;
use std::sync::Mutex;

mod command;
mod error;
mod model;
pub mod sqlite_init;

use crate::model::db_connection::DatabaseConnection;

// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}! You've been greeted from Rust!", name)
}

impl Default for DatabaseConnection {
    fn default() -> Self {
        let conn = Connection::open("works.db");
        match conn {
            Ok(conn) => DatabaseConnection {
                conn: Arc::new(Mutex::new(conn)),
            },
            Err(e) => {
                panic!("Failed to create database connection: {}", e);
            }
        }
    }
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .manage(DatabaseConnection::default())
        .plugin(tauri_plugin_log::Builder::new().build())
        .plugin(tauri_plugin_opener::init())
        .invoke_handler(tauri::generate_handler![
            greet,
            command::material_command::create_material,
            command::material_command::list_material,
            command::material_command::update_material,
            command::material_command::material_detail,
            command::material_command::list_materials_by_code,
            command::company_command::create_company,
            command::company_command::update_company,
            command::company_command::list_company_by_name,
            command::company_command::list_company,
            command::company_command::company_detail,
            command::event_command::create_event,
            command::event_command::list_event,
            command::event_command::update_event,
            command::event_command::event_detail,
            command::order_command::create_order,
            command::order_command::list_order,
            command::order_command::update_order,
            command::order_command::order_detail,
            command::contact_command::create_contact,
            command::contact_command::update_contact,
            command::contact_command::list_contact,
            command::contact_command::list_contact_by_company,
            command::contact_command::contact_detail,
        ])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
